Python2自动化运维 day04
1.re模块
	1.1 正则表达式
	1.2 核心函数和方法
    1.3 贪婪匹配
2.socket模块
   2.1 TCP服务器、客户机
   2.2 UDP服务器、客户机
##############################################################################	
re模块  正则匹配
  ● 核心函数
   — re.match('regexp',data)    #匹配到返回查询结果，没有匹配到返回 None
   — re.search('regexp',data)   #在data整个字符串中扫描，匹配到返回结果
   — re.findall('regexp',data)  #返回一个匹配对象的列表
   — re.finditer('regexp',data) #与findall()功能相同,返回迭代器非列表;
	— re.split('分隔符',data)      #分隔数据
   — re.sub(pattern,repl,string)    #把字符串中所有匹配正则表达式的地方替换成新的字符串
	— *.group()
	— compile函数

  ● 例子
	>>> re.match('f..','food')   
	<_sre.SRE_Match object; span=(0, 3), match='foo'>
	>>> m=re.match('f..','food')
	>>> m.group()
	'foo'
	>>> re.match('f..','seafood')   #没有结果

	>>> re.search('f..','seafood')  #有结果
	<_sre.SRE_Match object; span=(3, 6), match='foo'>
	>>> m=re.search('(\d\d)*','2018世界杯')
	>>> m.group()
	'2018'
	
	>>> re.findall('f..','seafood is food') #列表形式返回
	['foo', 'foo']

	>>> for m in re.finditer('f..','seafood is food'):
	...     print(m.group())
	... 
	foo
	foo
    
	>>>	mylist	=	re.split('\.|-',	'hello-world.data')	
	>>>	print(mylist)	
	['hello',	'world',	'data']

	>>>	m	=	re.sub('X',	'Mr.	Smith',	'aVn:	X\nDear	X')	
	>>>	print(m)	
	aVn:	Mr.	Smith	
	Dear	Mr.	Smith	
##############################################################################
案例1:分析apache访问日志   #参考access_counter.py 或 access_log_count.py
	•  编写一个apche日志分析脚本
	1.  统计每个客户端访问apache服务器的次数
	2.  将统计信息通过字典的方式显示出来
	3.  分别统计客户端是Firefox和MSIE的访问次数
	4.  分别使用函数式编程和面向对象编程的方式实现
	5.  按访问次数，对客户端进行排序

//Counter函数可以统计数量，并且排序
>>> c=Counter()
>>> c.update(['192.168.1.1'])  #敲5次
>>> c.update(['192.168.1.2'])  #敲3次
>>> c.update(['192.168.1.3'])  #敲6次 
>>> c.update(['192.168.1.4'])  #敲10次
>>> c                          #结果
Counter({'192.168.1.4': 10, '192.168.1.3': 6, '192.168.1.1': 5, '192.168.1.2': 3})
>>> c.most_common(2)
[('192.168.1.4', 10), ('192.168.1.3', 6)]  #Counter().most_common(2) 显示最多的两项

##############################################################################
贪婪匹配

>>> import re
>>> m = re.search('.+(\d+)','My phone is : 13676240551')
>>> m.group()
'My phone is : 13676240551'
>>> m.group(1)   #m.group(1)返回(\d+)匹配结果，结果为'1'

# .+ 是贪婪匹配，.+ 会匹配尽可能多的字符，让 \d+ 匹配尽量少的字符
# ? 是取消贪婪匹配,  让 \d+ 匹配尽量多的字符
>>> m = re.search('.+?(\d+)','My phone is : 13676240551')
>>> m.group(1)
'13676240551'

##############################################################################
● 套接字
   类比网卡上的网口

● 面向连接与无连接
	TCP,套接字类型为SOCK_STREAM
	UDP,套接字类型为SOCK_DGRAM

● python中使用socket模块中的socket函数实现套接字的创建
##############################################################################
创建TCP服务器
● 创建TCP服务器的主要步骤如下:
	1.  创建服务器套接字:s = socket.socket()
	2.  绑定地址到套接字:s.bind()
	3.  启动监听:s.listen()
	4.  接受客户连接:s.accept()
	5.  与客户端通信:recv()/send()
	6.  关闭套接字:s.close()

● 案例2:创建TCP时间戳服务器  #参考 TCP_server.py
•  编写一个TCP服务器
	1.  服务器监听在0.0.0.0的21567端口上
	2.  收到客户端数据后,将其加上时间戳后回送给客户端
	3.  如果客户端发过来的字符全是空白字符,则终止与客
	户端的连接

##############################################################################
创建TCP客户端
● 创建TCP客户端的步骤主要如下:
	1.  创建客户端套接字:cs = socket.socket()
	2.  尝试连接服务器:cs.connect()
	3.  与服务器通信:cs.send()/cs.recv()
	4.  关闭客户端套接字:cs.close()

● 案例3:创建TCP时间戳客户端
•  编写一个TCP客户端
	1.  连接服务器的21567
	2.  接收用户从键盘上的输入
	3.  发送接收到的字符串给服务器
	4.  如果用户按ctrl + c则退出程序
##############################################################################
创建UDP服务器
● 创建UDP服务器的主要步骤如下:
	1.  创建服务器套接字:s = socket.socket()
	2.  绑定服务器套接字:s.bind()
	3.  接收、发送数据:s.recvfrom()/ss.sendto()
	4.  关闭套接字:s.close()

● 案例4:创建UDP时间戳服务器
	•  编写一个UDP服务器
	1.  服务器监听在0.0.0.0的21567端口上
	2.  收到客户端数据后,将其加上时间戳后回送给客户端
##############################################################################
创建UDP客户端
● 创建UDP客户端的步骤主要如下:
	1.  创建客户端套接字:cs = socket.socket()
	2.  与服务器通信:cs.sendto()/cs.recvfrom()
	3.  关闭客户端套接字:cs.close()

● 编写一个UDP客户端
	1.  连接服务器的21567
	2.  接收用户从键盘上的输入
	3.  发送接收到的字符串给服务器
	4.  如果用户按ctrl + c则退出程序

















































































